package com.example.demo.hot100;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * @Classname no10
 * @Description
 * @Date 2023/12/19 16:06
 * @Created by jyl
 * <p>
 * LRU缓存
 * 实现一个 LRU (Least Recently Used) 缓存数据结构。
 * <p>
 *
 *
 * 解：LRUCache类继承自LinkedHashMap，通过重写removeEldestEntry方法来定义LRU淘汰的策略。
 * 在main方法中创建了一个容量为3的LRU缓存，添加了三个键值对，然后查询了缓存中的数据，再添加一个新的键值对，触发了LRU淘汰
 */
public class no10 {

    public static void main(String[] args) {
        // 创建一个容量为3的LRU缓存
        LRUCache<Integer, String> lruCache = new LRUCache<>(3);

        // 添加数据
        lruCache.put(1, "One");
        lruCache.put(2, "Two");
        lruCache.put(3, "Three");

        // 查看缓存中的数据
        System.out.println("LRU Cache: " + lruCache);

        // 查询缓存中的数据
        System.out.println("Value for key 2: " + lruCache.get(2));

        // 添加新数据，触发LRU淘汰
        lruCache.put(4, "Four");

        // 查看缓存中的数据，1被淘汰
        System.out.println("LRU Cache after adding key 4: " + lruCache);
    }


    public static class LRUCache<K, V> extends LinkedHashMap<K, V> {

        private final int capacity;

        public LRUCache(int capacity) {
            super(capacity, 0.75f, true);
            this.capacity = capacity;
        }

        @Override
        protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
            return size() > capacity;
        }

    }

}
